package com.itheima.reggie.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.itheima.reggie.common.R;
import com.itheima.reggie.entity.Employee;
import com.itheima.reggie.service.EmployeeService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.DigestUtils;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;


import javax.servlet.http.HttpServletRequest;

@RestController //支持restful风格 因为返回的内容一般都是json
//@ResponseBody 响应的对象的设置为json格式放到响应体中
// + @Controller 结合 我们是控制层代码属于web层 与前端交互

@Slf4j //日志技术
@RequestMapping("/employee") //类上映射路径 是用来分类
public class EmployeeController {
    /*
    加上我们controller依赖对象   依赖service层对象
     */
    @Autowired
    private EmployeeService employeeService;

    //@RequestBody Employee employee 从请求体中解析json 数据封装成对象
    @PostMapping("/login") //处理post请求的映射路径
    public R<Employee> login(@RequestBody Employee employee, HttpServletRequest request) {
        log.info("[员工的登陆]:employee{}" + employee);
        //通过具体业务开发
        //通过service完成业务,业务的分析(根据产品原型和需求文档)
        //1;拿到客户密码,进行MD5加密处理
        String password = employee.getPassword();
        // 拿到的是原始密码  进行加密   面向对象语言进行 加密
        password = DigestUtils.md5DigestAsHex(password.getBytes());
        log.info("查看加密后的密码:" + password);
        //2.根据用户名取数据查询用户信息
        //创建查询条件对象
        LambdaQueryWrapper<Employee> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(Employee::getUsername, employee.getUsername());
        Employee emp = employeeService.getOne(queryWrapper);//根据条件查询一条信息

        //2.1 用户名不存在  没有必要校验  返回失败结果
        if (emp == null) {
            return R.error("登陆失败,用户名活密码错误");
        }
        //2.2用户名存在继续校验
        //3.如果用户名存在继续校验密码
        //3.1 如果密码不正确 就返回登陆失败结果
        //加密后的密码和查询到的密码进行校验
        if (!emp.getPassword().equals(password)) {
            return R.error("登陆失败,用户名或密码错误");
        }
        //3.2密码正确就继续校验
        //4.校验该用户的状态
        if (emp.getStatus() == 0) {
            return R.error("登陆失败,账号已禁用");
        }
        //是0 就返回 登陆失败
        //是 1就可以登陆了
        // 5: 可以登录,用户马上登陆了,为了方便登录后的操作
        // 建议 要求 把员工id存到session中 (减少频繁登录  保证一次会话中只用登录一次)
        // 通过参数位置 把 request要过来
        request.getSession().setAttribute("employee", emp.getId());
        //6.返回登陆成功结果
        return R.success(emp);
    }
    /**
     *
     * 业务退出
     * 把存在session中的用户状态删除
     *
     */
    @PostMapping("/logout")
    public R<String>logout(HttpServletRequest request){
        log.info("[员工退出登陆]");
        //清理session中保存当前用户的数据
        request.getSession().removeAttribute("employee");
        return R.success("退出成功");
    }
}


